package org.dromara.demo.controller;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.MessageUtils;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;



/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：测试国际化
 */
@Validated
@RestController
@RequestMapping("/demo/i18n")
public class TestI18nController {

    /**
     * 通过code获取国际化内容
     * code为 messages.properties 中的 key
     * <p>
     * 测试使用 user.register.success
     *
     * @param code 国际化code
     * @return R<Void> 返回一个不包含数据的结果对象，表示操作是否成功
     */
    @GetMapping()
    public R<Void> get(String code) {
        return R.ok(MessageUtils.message(code));
    }

    /**
     * Validator 校验国际化
     * 不传值 分别查看异常返回
     * <p>
     * 测试使用 not.null
     * @param str 非空字符串参数，若为空将触发 {@code @NotBlank} 注解的默认异常处理
     * @return 返回一个成功的响应对象 R，携带原始字符串数据
     */
    @GetMapping("/test1")
    public R<Void> test1(@NotBlank(message = "{not.null}") String str) {
        return R.ok(str);
    }

    /**
     * Bean 校验国际化
     * 不传值 分别查看异常返回
     * <p>
     * 测试使用 not.null
     * @param bo 经过验证的TestI18nBo对象，携带了客户端的请求参数
     * @return 返回一个包含bo的响应对象，表示请求处理成功并返回结果
     */
    @GetMapping("/test2")
    public R<TestI18nBo> test2(@Validated TestI18nBo bo) {
        return R.ok(bo);
    }

    /**
     * 国际化测试数据传输对象
     * 用于在系统内部传递与国际化相关的数据
     */
    @Data
    public static class TestI18nBo {

        /**
         * 名称字段，不能为空或空白
         * 如果名称为空或空白，将会抛出校验异常，提示信息为"{not.null}"
         */
        @NotBlank(message = "{not.null}")
        private String name;

        /**
         * 年龄字段，为一个整型数值
         * 年龄必须在0到100之间，不满足条件时，抛出校验异常，提示信息为"{length.not.valid}"
         * 年龄字段不能为空，否则将抛出校验异常，提示信息为"{not.null}"
         */
        @NotNull(message = "{not.null}")
        @Range(min = 0, max = 100, message = "{length.not.valid}")
        private Integer age;
    }
}
